/*
 * resmanager.h
 *
 *  Created on: Oct 24, 2011
 *      Author: fferri
 */

#ifndef RESMANAGER_H_
#define RESMANAGER_H_

#include "core/core_utils.h"



//class TiXmlNode;

namespace glog{
class CGlobalLog;
}

namespace lpe {
namespace resman {

/// el appender del resource manager.
const std::string RESMAN_APP = "[RESMAN]";

class CVirtualFileSystem; // Forward declaration
class DatasourceManager;
class Resource;
class IAbstractLoader;
class ResourceHashMap;

///=================================================================================================
/// @class	ResManager
///
/// @brief	Manager for resources.
/// La clase ResManager es la clase que hace de interface entre el resource manager y el resto del
/// sistema.
///
/// @author	Ferran Ferri
/// @date	02/11/2011
///=================================================================================================

class ResManager: public Singleton<lpe::resman::ResManager> {
private:
	// Needed to implement singleton
	friend class ::Singleton<lpe::resman::ResManager>;
	friend class ::std::auto_ptr<lpe::resman::ResManager>;

	/// Componente log para anotaciones sobre el proceso.
	glog::CGlobalLog* m_log;

	DatasourceManager* m_datasources;

	ResourceHashMap* m_resourceHashMap;

	boost::unordered_map<uint32_t, IAbstractLoader*> m_loaderHashMap;

	bool initResManLog();
	bool initResHashMap();
	/**
	 * Constructor por defecto. Privado por que esta dentro de un singleton
	 */
	ResManager();
	/**
	 * Destructor por defecto. Privado por que esta dentro de un singleton
	 */
	~ResManager();
public:
	/**
	 * Devuelve el VFS asociado al nombre que se le pasa.
	 * Esta funcion busca un Virtual File System indicado por el nombre y devuelve una referencia a este si se encuentra o null en caso contrario.
	 *
	 * @param dsName Nombre del datasource que se busca.
	 * @return Referencia al CVirtualFileSystem o NULL si no se encuentra
	 */
	const CVirtualFileSystem* getDataSourceByName(const std::string& dsName) const;
	/// Inicia el resource manager apuntando al fichero de configuracion "datasources.xml"
	bool init();
	/// Inicia el resource manager, con un fichero de configuracion propio. Este fichero de configuracion esta definido en TBD
	/// TODO Documentar el fichereo de configuracion datasources.xml

	bool init(const std::string& configFile);

	std::string getRawFileByName(const std::string& datasource, const std::string& fileName);

	const uint32_t loadResource(const std::string& datasource, const std::string& fileName);

	const uint32_t loadResource(const std::string& datasource, const std::string& fileName, Resource* customResource);

	Resource* acquireResource(const uint32_t id);
	void releaseResource(Resource* res);

	bool isResourceLoaded(const uint32_t id);
	const uint32_t cloneResource(const Resource* original, Resource* cloned);

	bool addLoader(IAbstractLoader* loader);
	bool removeLoader(IAbstractLoader* loader);
};

} // namespace resman
} // namespace lpe
#endif // RESMANAGER_H_
